package com.ruoyi.test.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 衣服切面
 */

@Aspect
@Component
public class DressAction {

    /**
     * 将下面相同的切点表达式抽取到统一的方法，使用的地方直接引用即可
     */
     @Pointcut("execution(* com.ruoyi.test.aspect.IPerson.takeAWash(..))")
    public void common(){}

    /**
     * 前置通知
     */
    @Before("common()")
    public void undress() {
        System.out.println(new Throwable().getStackTrace()[0] + "准备洗澡,脱衣服.....嘻嘻");
    }

    /**
     * 后置通知
     */
    @After("common()")
    public void wearDress() {
        System.out.println(new Throwable().getStackTrace()[0] + "洗澡完成！穿好衣服....");
    }

    /**
     * 环绕通知
     * @param point
     */
    @Around("common()")
    public void aroundAdvice(ProceedingJoinPoint point) {
        try {
            System.out.println(new Throwable().getStackTrace()[0] + "1 这里是环绕通知-前");
            point.proceed();
            System.out.println(new Throwable().getStackTrace()[0] + "2 这里是环绕通知-后");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

    }

    @AfterReturning("common()")
    public void returnAdvice(){
        System.out.println(new Throwable().getStackTrace()[0] + "这是方法正常执行完后会执行的通知");
    }


    @AfterThrowing("common()")
    public void exceptionAdvice(){
        System.out.println(new Throwable().getStackTrace()[0] + "方法执行抛出异常时会执行的异常通知");
    }

}
